package cn.zch.soft.util.unicode;
/**
 * 每六位描述一个字节
 *
 * @author zhouzhian
 */
public class UnicodeUtil {
  /**
   * 字符串编码成Unicode编码
   */
  public static String encode(String src) throws Exception {
    char c;
    StringBuilder str = new StringBuilder();
    int intAsc;
    String strHex;
    for (int i = 0; i < src.length(); i++) {
      c = src.charAt(i);
      intAsc = (int) c;
      strHex = Integer.toHexString(intAsc);
      if (intAsc > 128) {
        str.append("\\u" + strHex);
      }
      else {
        str.append("\\u00" + strHex); // 低位在前面补00
      }
    }
    return str.toString();
  }
  /**
   * Unicode解码成字符串
   *
   * @param src
   * @return
   */
  public static String decode(String src) {
    int t = src.length() / 6;
    StringBuilder str = new StringBuilder();
    for (int i = 0; i < t; i++) {
      String s = src.substring(i * 6, (i + 1) * 6); // 每6位描述一个字节
      // 高位需要补上00再转
      String s1 = s.substring(2, 4) + "00";
      // 低位直接转
      String s2 = s.substring(4);
      // 将16进制的string转为int
      int n = Integer.valueOf(s1, 16) + Integer.valueOf(s2, 16);
      // 将int转换为字符
      char[] chars = Character.toChars(n);
      str.append(new String(chars));
    }
    return str.toString();
  }

  /*-------------------------*/
  /**
   * 字符串编码成Unicode编码
   */
  public static String strToUnicode(String src) throws Exception {
    char c;
    StringBuilder str = new StringBuilder();
    int intAsc;
    String strHex;
    for (int i = 0; i < src.length(); i++) {
      c = src.charAt(i);
      intAsc = (int) c;
      strHex = Integer.toHexString(intAsc);
      if (intAsc > 128) {
        str.append("\\u" + strHex);
      }
      else {
        // 低位在前面补00
        str.append("\\u00" + strHex);
      }
    }
    return str.toString();
  }
  /**
   * Unicode解码成字符串
   */
  public static String unicodeToStr(String src) {
    int t = src.length() / 6;
    StringBuilder str = new StringBuilder();
    for (int i = 0; i < t; i++) {
      // 每6位描述一个字节
      String s = src.substring(i * 6, (i + 1) * 6);
      // 高位需要补上00再转
      String s1 = s.substring(2, 4) + "00";
      // 低位直接转
      String s2 = s.substring(4);
      // 将16进制的string转为int
      int n = Integer.valueOf(s1, 16) + Integer.valueOf(s2, 16);
      // 将int转换为字符
      char[] chars = Character.toChars(n);
      str.append(new String(chars));
    }
    return str.toString();
  }
  /*--------------------------------------------------------------------------------*/
  public static String zstrToUnicode(String src) throws Exception {
    char c;
    StringBuilder str = new StringBuilder();
    int intAsc;
    String strHex;
    for (int i = 0; i < src.length(); i++) {
      c = src.charAt(i);
      intAsc = (int) c;
      strHex = Integer.toHexString(intAsc);
      if (intAsc > 128) {
        str.append("\\u" + strHex);
      }
      else {
        // 低位在前面补00
        str.append("\\u00" + strHex);
      }
    }
    return str.toString();
  }
  /**
   * Unicode解码成字符串
   */
  public static String zunicodeToStr(String src) {
    int t = src.length() / 6;
    StringBuilder str = new StringBuilder();
    for (int i = 0; i < t; i++) {
      // 每6位描述一个字节
      String s = src.substring(i * 6, (i + 1) * 6);
      // 高位需要补上00再转
      String s1 = s.substring(2, 4) + "00";
      // 低位直接转
      String s2 = s.substring(4);
      // 将16进制的string转为int
      int n = Integer.valueOf(s1, 16) + Integer.valueOf(s2, 16);
      // 将int转换为字符
      char[] chars = Character.toChars(n);
      str.append(new String(chars));
    }
    return str.toString();
  }
  /*--------------------------------------------------------------------------------*/
  public static void main(String[] args) throws Exception {
    String str = "刘建鹏";
    String unicodeEncode = zstrToUnicode(str);
    System.out.println("UnicodeUtil.encode Result : " + unicodeEncode);
    str = zunicodeToStr(unicodeEncode);
    System.out.println("UnicodeUtil.decode Result : " + str);
  }
  /*-------------------------*/
}
